#include<iostream>
#include<unistd.h>
#include <sys/wait.h>
#include<vector>
#include<functional>
using namespace std;

//typedef void(*task_t)();
using task_t=std::function<void()>;
#define TASK_NUM 5

void Work(int cnt){
	std::cout<<"我是子进程，我正在运行,pid:"<<getpid()<<",cnt:"<<cnt<<std::endl;
}

void loadtask(){
	cout<<"正在运行下载任务..."<<endl;
}

void logtask(){
	cout<<"正在运行日志任务..."<<endl;
}

void showtask(){
	cout<<"正在运行展示任务..."<<endl;
}

class Task{
public:
	Task(int size=TASK_NUM):_size(size)
	{
		_tasks.resize(_size);
	}
	void addTask(task_t t){
		if(!t)  return ;
		for(int i=0;i<_size;i++){
			if(!_tasks[i]){
				_tasks[i]=t;
				return ;
			}
		}
		cout<<"任务数量满了!!!"<<endl;
	}
	
	void execute(){
		for(auto t:_tasks){
			if(t){
				t();
			}
		}
	}

private:
	int _size;
	vector<task_t> _tasks;
};


int main(){
	Task t;
	t.addTask(loadtask);
	t.addTask(logtask);
	t.addTask(showtask);
	pid_t id=fork();
	if(id==0){
		int cnt=10;
		while(cnt){
			Work(cnt);
			sleep(1);
			--cnt;
		}
		exit(0);
	}

	//轮询+非阻塞
	while(1){
		int status=0;
		pid_t rid=waitpid(id,&status,WNOHANG);
		if(rid>0){
			cout<<"等待"<<rid<<"退出成功"<<endl;
			break;
		}
		else if(rid==0){
			t.execute();
		}
		else{
			cout<<"等待失败!"<<endl;
			break;
		}
		sleep(1);
	}	
	return 0;
}

